class RelativeMemo < ActiveRecord::Base
  # attr_accessible :title, :body
  include Redmine::SafeAttributes
  belongs_to :open_source_project, :class_name => "OpenSourceProject", :foreign_key => 'osp_id'
  # belongs_to :author, :class_name => "User", :foreign_key => 'author_id'

  # has_many :tags, :through => :project_tags, :class_name => 'Tag'
  # has_many :project_tags, :class_name => 'ProjectTags'

  has_many :relation_topics, :class_name => 'RelativeMemoToOpenSourceProject'

  # has_many :no_uses, :as => :no_use, :dependent => :delete_all

  # has_many :bugs_to_osp, :class_name => 'BugToOsp', :foreign_key => 'relative_memo_id', :dependent => :destroy
  


  acts_as_taggable

  #default_scope {
  #  where("#{RelativeMemo.table_name}.title <> '' AND #{RelativeMemo.table_name}.content <> ''")
  #}
  scope :news, lambda {
    {
        :conditions => ["#{RelativeMemo.table_name}.memo_type=?", 'news'],
        :order => ["#{RelativeMemo.table_name}.review_num DESC"]
    }
  }

  validates_presence_of :title
  #validates :content, presence: true
  # validates_length_of :title, maximum: 50
  #validates_length_of :content, maximum: 3072
  validate :cannot_reply_to_locked_topic, :on => :create
  #validates_uniqueness_of :osp_id, :scope => [:title, :content]

  acts_as_tree :counter_cache => :review_num, :order => "#{RelativeMemo.table_name}.created_at ASC"
  acts_as_attachable

  #solr search
  # searchable do
    # text :title, :stored => false
    # integer :review_num
    # #integer :parent_id
    # time :created_time
    # text :tags
    # string :source, :stored => false
    # #integer :view_num
    # #integer :view_num_ossean
    # #integer :collection_num
    # #join(:osp_id, :target => RelativeMemoToOpenSourceProject, :type => :integer, :join => { :from => :relative_memo_id, :to => :id }, :as => 'osp_id')
    # #join(:relative_memo_id, :target => RelativeMemoToOpenSourceProject, :type => :integer, :join => { :from => :relative_memo_id, :to => :id }, :as => 'relative_memo_id')
  # end

  belongs_to :last_reply, :class_name => 'RelativeMemo', :foreign_key => 'last_reply_id'
  # acts_as_searchable :column => ['title', 'content'],
  #           #:include => { :forum => :p}
  #           #:project_key => "#{Forum.table_name}.project_id"
  #           :date_column => "#{table_name}.created_at"

  # acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.title}"},
  # :datetime => :updated_at,
  # # :datetime => :created_at,
  # :description => :content,
  # :author => :author,
  # :type => Proc.new {|o| o.parent_id.nil? ? 'Memo' : 'Reply'},
  # :url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :r => o.id, :anchor => "reply-#{o.id}"})}
  # acts_as_activity_provider :author_key => :author_id,
  # :func => 'memos',
  # :timestamp => 'created_at'

  # :find_options => {:type => 'memos'}
  # acts_as_watchable

  safe_attributes "author_id",
                  "title",
                  "content",
                  "review_num",
                  "view_count_crawled",
                  "view_count_trustie",
                  "vote_up_count",
                  "collection_count",
                  "abstract",
                  "type",
                  "source",
                  "category",
                  "is_quote",
                  "last_memo_id"

  after_create :add_author_as_watcher, :reset_counters!
  # after_update :update_memos_forum
  after_destroy :reset_counters!
  # after_create :send_notification
  # after_save :plusParentAndForum
  # after_destroy :minusParentAndForum

  # scope :visible, lambda { |*args|
  #   includes(:forum => ).where()
  # }

  def cannot_reply_to_locked_topic
    errors.add :base, l(:label_memo_locked) if root.locked? && self != root
  end

  def short_content(length = 255)
    str = "^(.{,#{length}})[^\n\r]*.*$"
    content.gsub(Regexp.new(str), '\1...').strip if content
    #truncate()
  end

  # def update_memos_forum
  #   if forum_id_changed?
  #     Message.update_all({:board_id => board_id}, ["id = ? OR parent_id = ?", root.id, root.id ])
  #     Forum.reset_counters!(forum_id_was)
  #     Forum.reset_counters!(forum_id)
  #   end
  # end


  scope :no_use_for, lambda { |user_id|
    {:include => :no_uses,
     :conditions => ["#{NoUse.table_name}.user_id = ?", user_id]}
  }

  # 获取帖子的回复          
  def replies
    memos = RelativeMemo.where("id = ?", id)
  end

  def no_use_for?(user)
    self.no_uses.each do |no_use|
      if no_use.user_id == user.id
        return true
      end
    end
    false
  end

  def set_no_use(user, flag=true)
    flag ? set_filter(user) : remove_filter(user)
  end

  def set_filter(user)
    self.no_uses << NoUse.new(:user => user)
  end

  def remove_filter(user)
    return nil unless user && user.is_a?(User)
    NoUse.delete_all "no_use_type = '#{self.class}' AND no_use_id = #{self.id} AND user_id = #{user.id}"
  end

  def reset_counters!
    if parent && parent.id
      RelativeMemo.update_all({:last_reply_id => parent.children.maximum(:id)}, {:id => parent.id})
      parent.update_attribute(:updated_at, Time.now)
    end
    # forum.reset_counters!
  end

  def sticky?
    sticky == 1
  end

  def replies
    RelativeMemo.where("id = ?", id)
  end

  def locked?
    self.lock
  end

  def editable_by? user
    # user && user.logged? || (self.author == usr && usr.allowed_to?(:edit_own_messages, project))
    user.admin?
  end

  # def destroyable_by? user
  # (user && user.logged? && (Forum.find(self.forum_id).creator_id == user.id) ) || user.admin?
  # #self.author == user || user.admin?
  # end

  private

  def add_author_as_watcher
    Watcher.create(:watchable => self.root, :user => author)
  end

  def send_notification
    if Setting.notified_events.include?('message_posted')
      Mailer.message_posted(self).deliver
    end
  end

  # def plusParentAndForum
  # @forum = Forum.find(self.forum_id)
  # @forum.memo_count = @forum.memo_count.to_int + 1
  # @forum.last_memo_id = self.id
  # if self.parent_id
  # @parent_memo = Memo.find_by_id(self.parent_id)
  # @parent_memo.last_reply_id = self
  # @parent_memo.replies_count = @parent_memo.replies_count.to_int + 1
  # @parent_memo.save
  # else
  # @forum.topic_count = @forum.topic_count.to_int + 1
  # end
  # @forum.save
  # end

  # def minusParentAndForum
  # @forum = Forum.find(self.forum_id)
  # @forum.memo_count = @forum.memo_count.to_int - 1
  # @forum.memo_count = 0 if @forum.memo_count.to_int < 0
  # # @forum.last_memo_id = Memo.reorder('created_at ASC').find_all_by_forum_id(self.forum_id).last.id
  # if self.parent_id
  # @parent_memo = Memo.find_by_id(self.parent_id)
  # # @parent_memo.last_reply_id = Memo.reorder('created_at ASC').find_all_by_parent_id(self.parent_id).last.id
  # @parent_memo.replies_count = @parent_memo.replies_count.to_int - 1
  # @parent_memo.replies_count = 0 if @parent_memo.replies_count.to_int < 0
  # @parent_memo.save
  # else
  # @forum.topic_count = @forum.topic_count.to_int - 1
  # @forum.topic_count = 0 if @forum.topic_count.to_int < 0
  # end
  # @forum.save
  # end

  def short_description(length = 25)
    description.gsub(/^(.{#{length}}[^\n\r]).*$/m, '\1...').strip if description
  end

end

